﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public static class Extension
{
	private static log4net.ILog GetLogger()
	{
		return log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
	}

	#region string ConvertHashrate(this decimal value, string unit = "", string space = "") 算力数值转换。

	/// <summary>
	/// 算力数值转换。
	/// </summary>
	/// <param name="value"></param>
	/// <param name="unit">转换单位（byte、K、M、G、T，为空时获取最大单位）</param>
	/// <param name="space">算力数值与单位的间隔字符</param>
	/// <returns></returns>
	public static string ConvertHashrate(this decimal value, string unit = "", string space = "")
	{
		return TomNet.App.Web.Common.Utility.ConvertHashrate(value, unit, space);
	}

	#endregion

	#region List<T> ConvertList<T>(this string value, char separator = ',', bool clearEmpty = false) 将指定类型转换为泛型。

	/// <summary>
	/// 将指定类型转换为泛型。
	/// <para>字符串格式为：“字符1,字符2,...”，分割线与separator参数匹配。</para>
	/// </summary>
	/// <param name="value"></param>
	/// <param name="separator">分隔此实例中子字符串的Unicode字符数组、不包含分隔符的空数组或null</param>
	/// <param name="clearEmpty">是否清除空字符串</param>
	/// <returns></returns>
	public static List<T> ConvertList<T>(this string value, char separator = ',', bool clearEmpty = false)
	{
		log4net.ILog logger = GetLogger();
		List<T> infos = new List<T>();

		if (!string.IsNullOrWhiteSpace(value))
		{
			foreach (string val in value.Split(separator))
			{
				try
				{
					if (clearEmpty && !string.IsNullOrWhiteSpace(val))
						infos.Add((T)Convert.ChangeType(val, typeof(T)));
					else if (!clearEmpty)
						infos.Add((T)Convert.ChangeType(val, typeof(T)));
				}
				catch (Exception ex)
				{
					logger.Error(ex);
					logger.Info(
						"ConvertList<T>扩展执行失败：" + Environment.NewLine
						+ "Value = " + value + Environment.NewLine
						+ "间隔字符串为 " + separator
						+ "失败的值为 " + val);
				}
			}
		}

		return infos;
	}

	#endregion

	#region List<T> ConvertList<T>(this string value, char[] separator, bool clearEmpty = false) 将指定类型转换为泛型。

	/// <summary>
	/// 将指定类型转换为泛型。
	/// <para>字符串格式为：“字符1,字符2,...”，分割线与separator参数匹配。</para>
	/// </summary>
	/// <param name="value"></param>
	/// <param name="separator">分隔此实例中子字符串的Unicode字符数组、不包含分隔符的空数组或null</param>
	/// <param name="clearEmpty">是否清除空字符串</param>
	/// <returns></returns>
	public static List<T> ConvertList<T>(this string value, char[] separator, bool clearEmpty = false)
	{
		log4net.ILog logger = GetLogger();
		List<T> infos = new List<T>();

		if (!string.IsNullOrWhiteSpace(value))
		{
			foreach (string val in value.Split(separator))
			{
				try
				{
					if (clearEmpty && !string.IsNullOrWhiteSpace(val))
						infos.Add((T)Convert.ChangeType(val, typeof(T)));
					else if (!clearEmpty)
						infos.Add((T)Convert.ChangeType(val, typeof(T)));
				}
				catch (Exception ex)
				{
					logger.Error(ex);
					logger.Info(
						"ConvertList<T>扩展执行失败：" + Environment.NewLine
						+ "Value = " + value + Environment.NewLine
						+ "间隔字符串为 " + separator
						+ "失败的值为 " + val);
				}
				
			}
		}

		return infos;
	}

	#endregion

	#region List<string> ConvertListString(this string value, char separator = ',', bool clearEmpty = false) 将字符串转换为泛型

	/// <summary>
	/// 将字符串转换为泛型。
	/// <para>字符串格式为：“字符1,字符2,...”，分割线与separator参数匹配。</para>
	/// </summary>
	/// <param name="value"></param>
	/// <param name="separator">分隔此实例中子字符串的Unicode字符数组、不包含分隔符的空数组或null</param>
	/// <param name="clearEmpty">是否清除空字符串</param>
	/// <returns></returns>
	public static List<string> ConvertListString(this string value, char separator = ',', bool clearEmpty = false)
	{
		List<string> infos = new List<string>();

		if (!string.IsNullOrWhiteSpace(value))
		{
			foreach (string val in value.Split(separator))
			{
				if (clearEmpty && !string.IsNullOrWhiteSpace(val))
					infos.Add(val);
				else if (!clearEmpty)
					infos.Add(val);
			}
		}

		return infos;
	}

	#endregion

	#region List<string> ConvertListString(this string value, char[] separator = ',', bool clearEmpty = false) 将字符串转换为泛型

	/// <summary>
	/// 将字符串转换为泛型。
	/// <para>字符串格式为：“字符1,字符2,...”，分割线与separator参数匹配。</para>
	/// </summary>
	/// <param name="value"></param>
	/// <param name="separator">分隔此实例中子字符串的Unicode字符数组、不包含分隔符的空数组或null</param>
	/// <param name="clearEmpty">是否清除空字符串</param>
	/// <returns></returns>
	public static List<string> ConvertListString(this string value, char[] separator, bool clearEmpty = false)
	{
		List<string> infos = new List<string>();

		if (!string.IsNullOrWhiteSpace(value))
		{
			foreach (string val in value.Split(separator))
			{
				if (clearEmpty && !string.IsNullOrWhiteSpace(val))
					infos.Add(val);
				else if (!clearEmpty)
					infos.Add(val);
			}
		}

		return infos;
	}

	#endregion

	#region string ConvertString<T>(this IEnumerable<T> value, char separator = ',', char? quotation = null) 将泛型转换为字符串。

	/// <summary>
	/// 将泛型转换为字符串。
	/// <para>字符串格式为：“字符1,字符2,...”，分割线与separator参数匹配。</para>
	/// </summary>
	/// <typeparam name="T">元素的类型</typeparam>
	/// <param name="value"></param>
	/// <param name="separator">分隔此实例中子字符串的Unicode字符数组、不包含分隔符的空数组或null</param>
	/// <param name="quotation">引号字符（同时加在每字符串两侧，默认为空）</param>
	/// <returns></returns>
	public static string ConvertString<T>(this IEnumerable<T> value, char separator = ',', char? quotation = null)
	{
		string result = string.Empty;

		foreach (object obj in value)
		{
			if (!string.IsNullOrWhiteSpace(result)) result += separator;
			result += quotation + obj.ToString() + quotation;
		}

		return result;
	}

	#endregion

	#region string ToJsonString<T>(this T value) 将对象序列化为JSON字符串，不支持存在循环引用的对象

	/// <summary>
	/// 将对象序列化为JSON字符串，不支持存在循环引用的对象
	/// </summary>
	/// <typeparam name="T">动态类型</typeparam>
	/// <param name="value">动态类型对象</param>
	/// <returns>JSON字符串</returns>
	public static string ToJsonString<T>(this T value)
	{
		return Newtonsoft.Json.JsonConvert.SerializeObject(value);
	}

	#endregion
}